#ifndef ACTIVATIONFUNCTION_H_
#define ACTIVATIONFUNCTION_H_

#include <cmath>

#include "Defines.h"

/*-----------------------------------------------------------------------------
 *  Funções de ativação
 *-----------------------------------------------------------------------------*/
#define STEP 1          // Função degrau
#define PSEUDO_LINEAR 2 // Função pseudo-linear
#define SIGMOID 3       // Função sigmóide
#define HYPERBOLIC 4    // Função tangente hiperbólica
#define LOGISTIC 5      // Função logística

/*
 * =====================================================================================
 *        Class:  Activation
 *  Description:  Classe que representa uma função de ativação
 * =====================================================================================
 */
class Activation
{

public:

    /*-----------------------------------------------------------------------------
     *  Constrói uma função de ativação passando seu tipo e um parâmetro opcional
     *-----------------------------------------------------------------------------*/
    Activation(int type, double param = 0);

    /*-----------------------------------------------------------------------------
     *  Chama a função de ativação correspondente
     *-----------------------------------------------------------------------------*/
    double calc(double x);

    /*-----------------------------------------------------------------------------
     *  Chama a derivada da função de ativação correspondente
     *-----------------------------------------------------------------------------*/
    double derivate(double x);

private:

    /*-----------------------------------------------------------------------------
     *  Tipo
     *-----------------------------------------------------------------------------*/
    int type;

    /*-----------------------------------------------------------------------------
     *  Parâmetro
     *-----------------------------------------------------------------------------*/
    double param;

};

/*-----------------------------------------------------------------------------
 *  Ponteiro
 *-----------------------------------------------------------------------------*/
typedef boost::shared_ptr<Activation> ActivationPtr;

#endif /* ACTIVATIONFUNCTION_H_ */
